home *** CD-ROM | disk | FTP | other *** search
/ Revista do CD-ROM 123 / cdrom123.iso / essenc / extens / wweb / Web Developer.xpi / chrome / webdeveloper.jar / content / webdeveloper / webdeveloper.js < prev   
Encoding:
Text File  |  2004-11-21  |  90.1 KB  |  2,161 lines

  1. var webdeveloper_appliedStyles               = new Array();
  2. var webdeveloper_debug                       = false;
  3. var webdeveloper_javaScriptConsoleListener   = false;
  4. var webdeveloper_javaScriptError             = false;
  5. var webdeveloper_javaScriptWarning           = false;
  6. var webdeveloper_keyboardShortcutsConfigured = false;
  7. var webdeveloper_outlinedElements            = new Array();
  8. var webdeveloper_selectedTab                 = -1;
  9. var webdeveloper_userStyleSheet              = null;
  10.  
  11. webdeveloper_initialize();
  12.  
  13. // Displays the about dialog
  14. function webdeveloper_about()
  15. {
  16.     window.openDialog("chrome://webdeveloper/content/about/about.xul", "webdeveloper-about-dialog", "centerscreen,chrome,modal");
  17. }
  18.  
  19. // Add applied style
  20. function webdeveloper_addAppliedStyle(id)
  21. {
  22.     webdeveloper_appliedStyles.push(id);
  23. }
  24.  
  25. // Adds the style sheet at the given location with the given id
  26. function webdeveloper_addStyleSheet(location, id, applyStyle)
  27. {
  28.     const content      = window.document.getElementById("content");
  29.     const mainTabBox   = content.mTabBox;
  30.     const documentList = webdeveloper_getDocuments(content.browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  31.  
  32.     var headElementList = null;
  33.     var linkElement     = null;
  34.     var pageDocument    = null;
  35.  
  36.     // Loop through the documents
  37.     for(var i = 0; i < documentList.length; i++)
  38.     {
  39.         pageDocument    = documentList[i];
  40.         headElementList = pageDocument.getElementsByTagName("head");
  41.         linkElement     = pageDocument.createElement("link");
  42.  
  43.         linkElement.setAttribute("href", location);
  44.         linkElement.setAttribute("id", id);
  45.         linkElement.setAttribute("media", "all");
  46.         linkElement.setAttribute("rel", "stylesheet");
  47.         linkElement.setAttribute("type", "text/css");
  48.  
  49.         // If there is a head element
  50.         if(headElementList.length > 0)
  51.         {
  52.             headElementList[0].appendChild(linkElement);
  53.         }
  54.         else
  55.         {
  56.             pageDocument.documentElement.appendChild(linkElement);
  57.         }
  58.     }
  59.  
  60.     // If applying style
  61.     if(applyStyle)
  62.     {
  63.         webdeveloper_addAppliedStyle(id);
  64.     }
  65. }
  66.  
  67. // Applies all selected style sheets
  68. function webdeveloper_applyStyleSheets(reload)
  69. {
  70.     var appliedStyle = null;
  71.  
  72.     // Loop through the applied styles
  73.     for(var i = 0; i < webdeveloper_appliedStyles.length; i++)
  74.     {
  75.         appliedStyle = webdeveloper_appliedStyles[i];
  76.  
  77.         // Switch on the style
  78.         switch(appliedStyle)
  79.         {
  80.             case "webdeveloper-add-user-style-sheet":
  81.                 webdeveloper_addUserStyleSheet(document.getElementById("webdeveloper-add-user-style-sheet-menu"), false);
  82.                 break;
  83.             case "webdeveloper-disable-all-styles":
  84.                 webdeveloper_toggleStyles(document.getElementById("webdeveloper-disable-all-styles-menu"), false);
  85.                 break;
  86.             case "webdeveloper-disable-default-styles":
  87.                 webdeveloper_toggleStyles(document.getElementById("webdeveloper-disable-default-styles-menu"), false);
  88.                 break;
  89.             case "webdeveloper-disable-embedded-styles":
  90.                 webdeveloper_toggleEmbeddedStyles(document.getElementById("webdeveloper-disable-embedded-styles-menu"), false);
  91.                 break;
  92.             case "webdeveloper-disable-inline-styles":
  93.                 webdeveloper_toggleInlineStyles(document.getElementById("webdeveloper-disable-inline-styles-menu"), false);
  94.                 break;
  95.             case "webdeveloper-disable-linked-styles":
  96.                 webdeveloper_toggleLinkedStyles(document.getElementById("webdeveloper-disable-linked-styles-menu"), false);
  97.                 break;
  98.             case "webdeveloper-display-access-keys":
  99.                 webdeveloper_displayAccessKeys(document.getElementById("webdeveloper-display-access-keys-menu"), false);
  100.                 break;
  101.             case "webdeveloper-display-anchors":
  102.                 webdeveloper_displayAnchors(document.getElementById("webdeveloper-display-anchors-menu"), false);
  103.                 break;
  104.             case "webdeveloper-display-block-size":
  105.                 webdeveloper_displayBlockSize(document.getElementById("webdeveloper-display-block-size-menu"), false);
  106.                 break;
  107.             case "webdeveloper-display-current-size-title":
  108.                 // If the page has been reloaded
  109.                 if(reload)
  110.                 {
  111.                     webdeveloper_displayWindowSizeInTitle(document.getElementById("webdeveloper-display-current-size-title-menu"), false);
  112.                 }
  113.                 break;
  114.             case "webdeveloper-display-form-details":
  115.                 webdeveloper_displayFormDetails(document.getElementById("webdeveloper-display-form-details-menu"), false);
  116.                 break;
  117.             case "webdeveloper-display-id-class-details":
  118.                 webdeveloper_displayIDClassDetails(document.getElementById("webdeveloper-display-id-class-details-menu"), false);
  119.                 break;
  120.             case "webdeveloper-display-image-dimensions":
  121.                 webdeveloper_displayImageDimensions(document.getElementById("webdeveloper-display-image-dimensions-menu"), false);
  122.                 break;
  123.             case "webdeveloper-display-image-file-sizes":
  124.                 webdeveloper_displayImageFileSizes(document.getElementById("webdeveloper-display-image-file-sizes-menu"), false);
  125.                 break;
  126.             case "webdeveloper-display-image-paths":
  127.                 webdeveloper_displayImagePaths(document.getElementById("webdeveloper-display-image-paths-menu"), false);
  128.                 break;
  129.             case "webdeveloper-display-link-paths":
  130.                 webdeveloper_displayLinkPaths(document.getElementById("webdeveloper-display-link-paths-menu"), false);
  131.                 break;
  132.             case "webdeveloper-display-tab-index":
  133.                 webdeveloper_displayTabIndex(document.getElementById("webdeveloper-display-tab-index-menu"), false);
  134.                 break;
  135.             case "webdeveloper-display-topographic-information":
  136.                 webdeveloper_displayTopographicInformation(document.getElementById("webdeveloper-display-topographic-information-menu"), false);
  137.                 break;
  138.             case "webdeveloper-hide-background-images":
  139.                 webdeveloper_hideBackgroundImages(document.getElementById("webdeveloper-hide-background-images-menu"), false);
  140.                 break;
  141.             case "webdeveloper-hide-images":
  142.                 webdeveloper_hideImages(document.getElementById("webdeveloper-hide-images-menu"), "webdeveloper-hide-images", false);
  143.                 break;
  144.             case "webdeveloper-linearize-page":
  145.                 webdeveloper_linearizePage(document.getElementById("webdeveloper-linearize-page-menu"), false);
  146.                 break;
  147.             case "webdeveloper-make-images-invisible":
  148.                 webdeveloper_makeImagesInvisible(document.getElementById("webdeveloper-make-images-invisible-menu"), "webdeveloper-make-images-invisible", false);
  149.                 break;
  150.             case "webdeveloper-outline-block-level-elements":
  151.                 webdeveloper_outlineBlockLevelElements(document.getElementById("webdeveloper-outline-block-level-elements-menu"), false);
  152.                 break;
  153.             case "webdeveloper-outline-custom-elements":
  154.                 webdeveloper_outlineElements(document.getElementById("webdeveloper-outline-custom-elements-menu"), false);
  155.                 break;
  156.             case "webdeveloper-outline-deprecated-elements":
  157.                 webdeveloper_outlineDeprecatedElements(document.getElementById("webdeveloper-outline-deprecated-elements-menu"), false);
  158.                 break;
  159.             case "webdeveloper-outline-frames":
  160.                 webdeveloper_outlineFrames(document.getElementById("webdeveloper-outline-frames-menu"), false);
  161.                 break;
  162.             case "webdeveloper-outline-images-with-adjusted-dimensions":
  163.                 webdeveloper_outlineImagesWithAdjustedDimensions(document.getElementById("webdeveloper-outline-images-with-adjusted-dimensions-menu"), false);
  164.                 break;
  165.             case "webdeveloper-outline-images-with-empty-alt-attributes":
  166.                 webdeveloper_outlineImagesWithEmptyAltAttributes(document.getElementById("webdeveloper-outline-images-with-empty-alt-attributes-menu"), false);
  167.                 break;
  168.             case "webdeveloper-outline-images-without-alt-attributes":
  169.                 webdeveloper_outlineImagesWithoutAltAttributes(document.getElementById("webdeveloper-outline-images-without-alt-attributes-menu"), false);
  170.                 break;
  171.             case "webdeveloper-outline-images-without-dimensions":
  172.                 webdeveloper_outlineImagesWithoutDimensions(document.getElementById("webdeveloper-outline-images-without-dimensions-menu"), false);
  173.                 break;
  174.             case "webdeveloper-outline-images-without-title-attributes":
  175.                 webdeveloper_outlineImagesWithoutTitleAttributes(document.getElementById("webdeveloper-outline-images-without-title-attributes-menu"), false);
  176.                 break;
  177.             case "webdeveloper-outline-links-without-title-attributes":
  178.                 webdeveloper_outlineLinksWithoutTitleAttributes(document.getElementById("webdeveloper-outline-links-without-title-attributes-menu"), false);
  179.                 break;
  180.             case "webdeveloper-outline-selected-element":
  181.                 webdeveloper_outlineSelectedElement(document.getElementById("webdeveloper-outline-selected-element-menu"), false);
  182.                 break;
  183.             case "webdeveloper-outline-table-cells":
  184.                 webdeveloper_outlineTableCells(document.getElementById("webdeveloper-outline-table-cells-menu"), false);
  185.                 break;
  186.             case "webdeveloper-outline-tables":
  187.                 webdeveloper_outlineTables(document.getElementById("webdeveloper-outline-tables-menu"), false);
  188.                 break;
  189.             case "webdeveloper-replace-images-with-alt-attributes":
  190.                 webdeveloper_replaceImagesWithAltAttributes(document.getElementById("webdeveloper-replace-images-with-alt-attributes-menu"), false);
  191.                 break;
  192.             case "webdeveloper-show-comments":
  193.                 webdeveloper_toggleComments(document.getElementById("webdeveloper-show-comments-menu"), false);
  194.                 break;
  195.             case "webdeveloper-use-border-box-model":
  196.                 webdeveloper_useBorderBoxModel(document.getElementById("webdeveloper-use-border-box-model-menu"), false);
  197.                 break;
  198.             case "webdeveloper-view-style-information":
  199.                 webdeveloper_viewStyleInformation(document.getElementById("webdeveloper-view-style-information-menu"), false);
  200.                 break;
  201.         }
  202.     }
  203. }
  204.  
  205. // Changes the options
  206. function webdeveloper_changeOptions()
  207. {
  208.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  209.     const toolbar            = document.getElementById("webdeveloper-toolbar");
  210.  
  211.     var element                   = null;
  212.     var hideMenuPreference        = false;
  213.     var hideContextMenuPreference = false;
  214.  
  215.     // If the hide menu preference is set
  216.     if(preferencesService.prefHasUserValue("webdeveloper.menu.hide"))
  217.     {
  218.         hideMenuPreference = preferencesService.getBoolPref("webdeveloper.menu.hide");
  219.     }
  220.  
  221.     // If the hide context menu preference is set
  222.     if(preferencesService.prefHasUserValue("webdeveloper.context.hide"))
  223.     {
  224.         hideContextMenuPreference = preferencesService.getBoolPref("webdeveloper.context.hide");
  225.     }
  226.  
  227.     // If the toolbar exists
  228.     if(toolbar)
  229.     {
  230.         const toolbarVisible = window.toolbar.visible;
  231.  
  232.         // If the toolbar is visible and the toolbar icons preference is set
  233.         if(toolbarVisible && preferencesService.prefHasUserValue("webdeveloper.toolbar.icons"))
  234.         {
  235.             const toolbarButtons = toolbar.getElementsByTagName("toolbarbutton");
  236.  
  237.             var toolbarPreference = preferencesService.getCharPref("webdeveloper.toolbar.icons");
  238.  
  239.             toolbar.setAttribute("mode", toolbarPreference);
  240.  
  241.             // If the toolbar preference is set to full
  242.             if(toolbarPreference == "full")
  243.             {
  244.                 toolbarPreference = null;
  245.             }
  246.             else if(toolbarPreference == "icons")
  247.             {
  248.                 toolbarPreference = "pictures";
  249.             }
  250.  
  251.             toolbar.setAttribute("buttonstyle", toolbarPreference);
  252.  
  253.             // Loop through the toolbar buttons
  254.             for(var i = 0; i < toolbarButtons.length; i++)
  255.             {
  256.                 toolbarButtons[i].setAttribute("buttonstyle", toolbarPreference);
  257.             }
  258.  
  259.             // If the toolbar preference is set to text
  260.             if(toolbarPreference == "text")
  261.             {
  262.                 element = document.getElementById("webdeveloper-toggle-statusbar");
  263.  
  264.                 // If the element exists
  265.                 if(element)
  266.                 {
  267.                     const stringBundle = document.getElementById("webdeveloper-string-bundle");
  268.  
  269.                     element.setAttribute("label", stringBundle.getString("webdeveloper_toggleLabel"));
  270.                 }
  271.             }
  272.             else
  273.             {
  274.                 element = document.getElementById("webdeveloper-javascript-statusbar");
  275.  
  276.                 // If the element exists
  277.                 if(element)
  278.                 {
  279.                     element.removeAttribute("label");
  280.                 }
  281.  
  282.                 element = document.getElementById("webdeveloper-render-mode-statusbar");
  283.  
  284.                 // If the element exists
  285.                 if(element)
  286.                 {
  287.                     element.removeAttribute("label");
  288.                 }
  289.  
  290.                 element = document.getElementById("webdeveloper-toggle-statusbar");
  291.  
  292.                 // If the element exists
  293.                 if(element)
  294.                 {
  295.                     element.removeAttribute("label");
  296.                 }
  297.             }
  298.         }
  299.     }
  300.  
  301.     element = document.getElementById("webdeveloper-menu");
  302.  
  303.     // If the element exists
  304.     if(element)
  305.     {
  306.         element.setAttribute("hidden", hideMenuPreference);
  307.     }
  308.  
  309.     element = document.getElementById("webdeveloper-context");
  310.  
  311.     // If the element exists
  312.     if(element)
  313.     {
  314.         element.setAttribute("hidden", hideContextMenuPreference);
  315.     }
  316.  
  317.     element = document.getElementById("webdeveloper-context-separator");
  318.  
  319.     // If the element exists
  320.     if(element)
  321.     {
  322.         element.setAttribute("hidden", hideContextMenuPreference);
  323.     }
  324.  
  325.     // If the keyboard shortcuts have not been configured
  326.     if(!webdeveloper_keyboardShortcutsConfigured)
  327.     {
  328.         webdeveloper_keyboardShortcutsConfigured = webdeveloper_configureKeyboardShortcuts(false);
  329.     }
  330. }
  331.  
  332. // Configures the equivalent element to whichever one is set
  333. function webdeveloper_configureEquivalentElements(element, attribute, value)
  334. {
  335.     const elementId = element.getAttribute("id");
  336.  
  337.     var equivalentElement   = null;
  338.     var equivalentElementId = null;
  339.  
  340.     // If the element exists
  341.     if(element)
  342.     {
  343.         // If the value is set
  344.         if(value)
  345.         {
  346.             element.setAttribute(attribute, value);
  347.         }
  348.         else
  349.         {
  350.             element.removeAttribute(attribute);
  351.         }
  352.     }
  353.  
  354.     // If the element is the context
  355.     if(elementId.indexOf("context") != -1)
  356.     {
  357.         equivalentElementId = elementId.split("context").join("menu");
  358.         equivalentElement   = document.getElementById(equivalentElementId);
  359.  
  360.         // If the equivalent element exists
  361.         if(equivalentElement)
  362.         {
  363.             // If the value is set
  364.             if(value)
  365.             {
  366.                 equivalentElement.setAttribute(attribute, value);
  367.             }
  368.             else
  369.             {
  370.                 equivalentElement.removeAttribute(attribute);
  371.             }
  372.         }
  373.  
  374.         equivalentElementId = elementId.split("context").join("toolbar");
  375.         equivalentElement   = document.getElementById(equivalentElementId);
  376.  
  377.         // If the equivalent element exists
  378.         if(equivalentElement)
  379.         {
  380.             // If the value is set
  381.             if(value)
  382.             {
  383.                 equivalentElement.setAttribute(attribute, value);
  384.             }
  385.             else
  386.             {
  387.                 equivalentElement.removeAttribute(attribute);
  388.             }
  389.         }
  390.     }
  391.     else if(elementId.indexOf("menu") != -1)
  392.     {
  393.         equivalentElementId = elementId.split("menu").join("context");
  394.         equivalentElement   = document.getElementById(equivalentElementId);
  395.  
  396.         // If the equivalent element exists
  397.         if(equivalentElement)
  398.         {
  399.             // If the value is set
  400.             if(value)
  401.             {
  402.                 equivalentElement.setAttribute(attribute, value);
  403.             }
  404.             else
  405.             {
  406.                 equivalentElement.removeAttribute(attribute);
  407.             }
  408.         }
  409.  
  410.         equivalentElementId = elementId.split("menu").join("toolbar");
  411.         equivalentElement   = document.getElementById(equivalentElementId);
  412.  
  413.         // If the equivalent element exists
  414.         if(equivalentElement)
  415.         {
  416.             // If the value is set
  417.             if(value)
  418.             {
  419.                 equivalentElement.setAttribute(attribute, value);
  420.             }
  421.             else
  422.             {
  423.                 equivalentElement.removeAttribute(attribute);
  424.             }
  425.         }
  426.     }
  427.     else if(elementId.indexOf("toolbar") != -1)
  428.     {
  429.         equivalentElementId = elementId.split("toolbar").join("context");
  430.         equivalentElement   = document.getElementById(equivalentElementId);
  431.  
  432.         // If the equivalent element exists
  433.         if(equivalentElement)
  434.         {
  435.             // If the value is set
  436.             if(value)
  437.             {
  438.                 equivalentElement.setAttribute(attribute, value);
  439.             }
  440.             else
  441.             {
  442.                 equivalentElement.removeAttribute(attribute);
  443.             }
  444.         }
  445.  
  446.         equivalentElementId = elementId.split("toolbar").join("menu");
  447.         equivalentElement   = document.getElementById(equivalentElementId);
  448.  
  449.         // If the equivalent element exists
  450.         if(equivalentElement)
  451.         {
  452.             // If the value is set
  453.             if(value)
  454.             {
  455.                 equivalentElement.setAttribute(attribute, value);
  456.             }
  457.             else
  458.             {
  459.                 equivalentElement.removeAttribute(attribute);
  460.             }
  461.         }
  462.     }
  463. }
  464.  
  465. // Configure the keyboard shortcuts
  466. function webdeveloper_configureKeyboardShortcuts(reset)
  467. {
  468.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  469.  
  470.     var mainDocument = null;
  471.     var success      = false;
  472.  
  473.     // If there is a parent window
  474.     if(window.opener)
  475.     {
  476.         // If there is a grand parent window
  477.         if(window.opener.opener)
  478.         {
  479.             mainDocument = window.opener.opener.document;
  480.         }
  481.         else
  482.         {
  483.             mainDocument = window.opener.document;
  484.         }
  485.     }
  486.     else
  487.     {
  488.         mainDocument = document;
  489.     }
  490.  
  491.     // If a main document was found
  492.     if(mainDocument)
  493.     {
  494.         var id                 = null;
  495.         var key                = null;
  496.         var keyPreference      = null;
  497.         var keyPreferenceValue = null;
  498.         var keys               = null;
  499.         var keySet             = mainDocument.getElementById("mainKeyset");
  500.         var toolCount          = 0;
  501.         var url                = null;
  502.  
  503.         // If the key set was not found
  504.         if(!keySet)
  505.         {
  506.             keySet = mainDocument.getElementById("navKeys");
  507.         }
  508.  
  509.         keys = keySet.childNodes;
  510.  
  511.         // Loop through the keys
  512.         for(var i = 0; i < keys.length; i++)
  513.         {
  514.             key = keys.item(i);
  515.  
  516.             // If the key has an id starting with webdeveloper
  517.             if(key.hasAttribute("id") && key.getAttribute("id").indexOf("webdeveloper") == 0)
  518.             {
  519.                 id      = key.getAttribute("id").split("-").join(".");
  520.                 success = true;
  521.  
  522.                 // If the key preference is set
  523.                 if(preferencesService.prefHasUserValue(id))
  524.                 {
  525.                     key.setAttribute("key", preferencesService.getCharPref(id));
  526.                 }
  527.                 else if(!reset)
  528.                 {
  529.                     preferencesService.setCharPref(id, key.getAttribute("key"));
  530.                 }
  531.             }
  532.         }
  533.  
  534.         // If the tool count preference is set
  535.         if(preferencesService.prefHasUserValue("webdeveloper.tool.count"))
  536.         {
  537.             toolCount = preferencesService.getIntPref("webdeveloper.tool.count");
  538.         }
  539.  
  540.         // Loop through the possible tools
  541.         for(i = 1; i <= toolCount; i++)
  542.         {
  543.             keyPreference = "webdeveloper.tool." + i + ".key";
  544.             url           = "webdeveloper.tool." + i + ".url";
  545.  
  546.             // If the URL and key preferences are set
  547.             if(preferencesService.prefHasUserValue(url) && preferencesService.prefHasUserValue(keyPreference))
  548.             {
  549.                 keyPreferenceValue = preferencesService.getCharPref(keyPreference).trim();
  550.  
  551.                 // If the key preference value is set
  552.                 if(keyPreferenceValue)
  553.                 {
  554.                     key = mainDocument.createElement("key");
  555.  
  556.                     key.setAttribute("id", keyPreference);
  557.                     key.setAttribute("key", preferencesService.getCharPref(keyPreference).trim());
  558.                     key.setAttribute("modifiers", "accel,shift");
  559.                     key.setAttribute("oncommand", "webdeveloper_loadURL('" + preferencesService.getCharPref(url).trim() + "' + escape(window.content.document.documentURI))");
  560.                     keySet.appendChild(key);
  561.                 }
  562.             }
  563.         }
  564.     }
  565.  
  566.     return success;
  567. }
  568.  
  569. // Disables the extension
  570. function webdeveloper_disable(forceDisable)
  571. {
  572.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  573.     const stringBundle       = document.getElementById("webdeveloper-string-bundle");
  574.  
  575.     var disable     = true;
  576.     var element     = null;
  577.     var keys        = null;
  578.     var keySet      = document.getElementById("mainKeyset");
  579.     var textToolbar = false;
  580.  
  581.     // If the key set was not found
  582.     if(!keySet)
  583.     {
  584.         keySet = document.getElementById("navKeys");
  585.     }
  586.  
  587.     keys = keySet.childNodes;
  588.  
  589.     // If not forcing disable and the disable extension preference is set
  590.     if(!forceDisable && preferencesService.prefHasUserValue("webdeveloper.disabled"))
  591.     {
  592.         disable = !preferencesService.getBoolPref("webdeveloper.disabled");
  593.     }
  594.  
  595.     // If the toolbar preference has a value and is set to text
  596.     if(preferencesService.prefHasUserValue("webdeveloper.toolbar.icons") && preferencesService.getCharPref("webdeveloper.toolbar.icons") == "text")
  597.     {
  598.         textToolbar = true;
  599.     }
  600.  
  601.     preferencesService.setBoolPref("webdeveloper.disabled", disable);
  602.  
  603.     // Loop through the keys
  604.     for(var i = 0; i < keys.length; i++)
  605.     {
  606.         element = keys.item(i);
  607.  
  608.         // If the key has an id starting with webdeveloper
  609.         if(element.hasAttribute("id") && element.getAttribute("id").indexOf("webdeveloper") == 0)
  610.         {
  611.             webdeveloper_disableElement(element, disable);
  612.         }
  613.     }
  614.  
  615.     webdeveloper_disableElement(document.getElementById("webdeveloper-context"), disable);
  616.     webdeveloper_disableElement(document.getElementById("webdeveloper-menu"), disable);
  617.     webdeveloper_disableElement(document.getElementById("webdeveloper-edit-css-sidebar"), disable);
  618.  
  619.     webdeveloper_disableElement(document.getElementById("webdeveloper-disable-toolbar"), disable);
  620.     webdeveloper_disableElement(document.getElementById("webdeveloper-css-toolbar"), disable);
  621.     webdeveloper_disableElement(document.getElementById("webdeveloper-forms-toolbar"), disable);
  622.     webdeveloper_disableElement(document.getElementById("webdeveloper-images-toolbar"), disable);
  623.     webdeveloper_disableElement(document.getElementById("webdeveloper-information-toolbar"), disable);
  624.     webdeveloper_disableElement(document.getElementById("webdeveloper-miscellaneous-toolbar"), disable);
  625.     webdeveloper_disableElement(document.getElementById("webdeveloper-outline-toolbar"), disable);
  626.     webdeveloper_disableElement(document.getElementById("webdeveloper-resize-toolbar"), disable);
  627.     webdeveloper_disableElement(document.getElementById("webdeveloper-tools-toolbar"), disable);
  628.     webdeveloper_disableElement(document.getElementById("webdeveloper-view-source-toolbar"), disable);
  629.     webdeveloper_disableElement(document.getElementById("webdeveloper-options-toolbar"), disable);
  630.  
  631.     element = document.getElementById("webdeveloper-render-mode-statusbar");
  632.  
  633.     // If the element exists
  634.     if(element)
  635.     {
  636.         // If disabling
  637.         if(disable)
  638.         {
  639.             element.setAttribute("class", "webdeveloper-statusbar-button");
  640.             element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_standardsComplianceModeTooltip"));
  641.  
  642.             // If the toolbar is in text mode
  643.             if(textToolbar)
  644.             {
  645.                 element.setAttribute("label", stringBundle.getString("webdeveloper_standardsComplianceModeLabel"));
  646.             }
  647.         }
  648.         else
  649.         {
  650.             webdeveloper_updateRenderMode();
  651.         }
  652.  
  653.         webdeveloper_disableElement(element, disable);
  654.     }
  655.  
  656.     element = document.getElementById("webdeveloper-javascript-statusbar");
  657.  
  658.     // If the element exists
  659.     if(element)
  660.     {
  661.         element.setAttribute("class", "webdeveloper-statusbar-button");
  662.         element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_javaScriptNoErrorsTooltip"));
  663.         webdeveloper_disableElement(element, disable);
  664.  
  665.         // If the toolbar is in text mode
  666.         if(textToolbar)
  667.         {
  668.             element.setAttribute("label", stringBundle.getString("webdeveloper_javaScriptNoErrorsLabel"));
  669.         }
  670.     }
  671.  
  672.     element = document.getElementById("sidebar-box");
  673.  
  674.     // If the element exists and is visible
  675.     if(element && !element.getAttribute("hidden"))
  676.     {
  677.         // If the element is showing the edit CSS sidebar
  678.         if(element.getAttribute("src") == "chrome://webdeveloper/content/sidebar/edit_css.xul")
  679.         {
  680.             toggleSidebar("webdeveloper-edit-css-sidebar");
  681.         }
  682.         else if(element.getAttribute("src") == "chrome://webdeveloper/content/sidebar/view_style_information.xul")
  683.         {
  684.             toggleSidebar("webdeveloper-view-style-information-sidebar");
  685.         }
  686.     }
  687.  
  688.     element = document.getElementById("webdeveloper-toggle-statusbar");
  689.  
  690.     // If the element exists
  691.     if(element)
  692.     {
  693.         // If disabling the extension
  694.         if(disable)
  695.         {
  696.             element.setAttribute("class", "enable webdeveloper-statusbar-button");
  697.             element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_enable"));
  698.         }
  699.         else
  700.         {
  701.             element.setAttribute("class", "webdeveloper-statusbar-button");
  702.             element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_disable"));
  703.         }
  704.     }
  705.  
  706.     // If disabling
  707.     if(disable)
  708.     {
  709.         // If already listening to the console
  710.         if(webdeveloper_javaScriptConsoleListener)
  711.         {
  712.             const consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService().QueryInterface(Components.interfaces.nsIConsoleService);
  713.  
  714.             // Try to unregister the listener
  715.             try
  716.             {
  717.                 consoleService.unregisterListener(WebDeveloperJavaScriptConsoleListener);
  718.             }
  719.             catch(exception)
  720.             {
  721.                 // Do nothing
  722.             }
  723.  
  724.             webdeveloper_javaScriptConsoleListener = false;
  725.         }
  726.  
  727.         webdeveloper_resetPage();
  728.     }
  729. }
  730.  
  731. // Disables an element
  732. function webdeveloper_disableElement(element, disable)
  733. {
  734.     // If the element exists
  735.     if(element)
  736.     {
  737.         element.setAttribute("disabled", disable);
  738.     }
  739. }
  740.  
  741. // Disables the given preference
  742. function webdeveloper_disablePreference(element, preference)
  743. {
  744.     const checked            = element.getAttribute("checked");
  745.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  746.  
  747.     preferencesService.setBoolPref(preference, !checked);
  748.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  749. }
  750.  
  751. // Displays the elements ancestors in the status bar
  752. function webdeveloper_displayElementAncestors(event)
  753. {
  754.     // If there is a target
  755.     if(event.target)
  756.     {
  757.         window.content.status = webdeveloper_getElementAncestors(event.target, "");
  758.  
  759.         event.preventDefault();
  760.     }
  761. }
  762.  
  763. // Enables the given preference
  764. function webdeveloper_enablePreference(element, preference)
  765. {
  766.     const checked            = element.getAttribute("checked");
  767.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  768.  
  769.     // If the element is checked - explicit if required
  770.     if(checked)
  771.     {
  772.         preferencesService.setBoolPref(preference, true);
  773.     }
  774.     else
  775.     {
  776.         preferencesService.setBoolPref(preference, false);
  777.     }
  778.  
  779.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  780. }
  781.  
  782. // Generates a page in a new tab or window
  783. function webdeveloper_generatePage(url)
  784. {
  785.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  786.  
  787.     var generatedPage = null;
  788.  
  789.     // If the open tabs preference is set to true
  790.     if(preferencesService.prefHasUserValue("webdeveloper.open.tabs") && preferencesService.getBoolPref("webdeveloper.open.tabs"))
  791.     {
  792.         const newTab = getBrowser().addTab(url);
  793.  
  794.         getBrowser().selectedTab = newTab;
  795.         generatedPage = window;
  796.     }
  797.     else
  798.     {
  799.         generatedPage = window.open(url);
  800.     }
  801.  
  802.     return generatedPage;
  803. }
  804.  
  805. // Get the cookies
  806. function webdeveloper_getCookies(host, sort)
  807. {
  808.     const cookieEnumeration = Components.classes["@mozilla.org/cookiemanager;1"].getService(Components.interfaces.nsICookieManager).enumerator;
  809.  
  810.     var cookies = new Array();
  811.  
  812.     // Loop through the cookies
  813.     while(cookieEnumeration.hasMoreElements())
  814.     {
  815.         const cookie = cookieEnumeration.getNext().QueryInterface(Components.interfaces.nsICookie);
  816.  
  817.         var cookieHost = cookie.host;
  818.  
  819.         // If there is a host for this cookie
  820.         if(cookieHost)
  821.         {
  822.             // If the cookie host starts with '.'
  823.             if(cookieHost.charAt(0) == ".")
  824.             {
  825.                 cookieHost = cookieHost.substring(1);
  826.             }
  827.  
  828.             // If the host and cookie host match
  829.             if(host == cookieHost || host.indexOf("." + cookieHost) != -1)
  830.             {
  831.                 cookies.push(cookie);
  832.             }
  833.         }
  834.     }
  835.  
  836.     // If sorting cookies
  837.     if(sort)
  838.     {
  839.         cookies.sort(webdeveloper_sortCookies);
  840.     }
  841.  
  842.     return cookies;
  843. }
  844.  
  845. // Gets all the documents from the current page
  846. function webdeveloper_getDocuments(frame, documentList)
  847. {
  848.     const framesList = frame.frames;
  849.  
  850.     documentList.push(frame.document);
  851.  
  852.     // Loop through the frames
  853.     for(var i = 0; i < framesList.length; i++)
  854.     {
  855.         webdeveloper_getDocuments(framesList[i], documentList);
  856.     }
  857.  
  858.     return documentList;
  859. }
  860.  
  861. // Get an elements ancestors
  862. function webdeveloper_getElementAncestors(element, ancestorList)
  863. {
  864.     const classAttribute = element.getAttribute("class");
  865.     const idAttribute    = element.getAttribute("id");
  866.     const parentElement  = element.parentNode;
  867.  
  868.     var elementText = element.tagName.toLowerCase();
  869.  
  870.     // If there is a class attribute
  871.     if(classAttribute)
  872.     {
  873.         elementText += "." + classAttribute;
  874.     }
  875.  
  876.     // If there is an id attribute
  877.     if(idAttribute)
  878.     {
  879.         elementText += "#" + idAttribute;
  880.     }
  881.  
  882.     // If there is an ancestor list
  883.     if(ancestorList)
  884.     {
  885.         elementText += " > " + ancestorList
  886.     }
  887.  
  888.     // If there is a parent element with a tag name
  889.     if(parentElement && parentElement.tagName)
  890.     {
  891.         return webdeveloper_getElementAncestors(parentElement, elementText);
  892.     }
  893.     else
  894.     {
  895.         return elementText;
  896.     }
  897. }
  898.  
  899. // Initializes the extension
  900. function webdeveloper_initialize()
  901. {
  902.     const documentContent    = window.document.getElementById("content");
  903.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  904.  
  905.     webdeveloper_setupDefaultOptions();
  906.  
  907.     // If the debug preference is set
  908.     if(preferencesService.prefHasUserValue("webdeveloper.debug"))
  909.     {
  910.         webdeveloper_debug = preferencesService.getBoolPref("webdeveloper.debug");
  911.     }
  912.  
  913.     // If the document content exists
  914.     if(documentContent)
  915.     {
  916.         const tabBox = documentContent.mTabBox;
  917.  
  918.         // Try to remove the event listener
  919.         try
  920.         {
  921.             tabBox.removeEventListener("select", webdeveloper_tabSelect, true);
  922.         }
  923.         catch(exception)
  924.         {
  925.             // Do nothing
  926.         }
  927.  
  928.         tabBox.addEventListener("select", webdeveloper_tabSelect, true);
  929.     }
  930.  
  931.     // Try to remove the event listeners
  932.     try
  933.     {
  934.         window.removeEventListener("load", webdeveloper_pageLoad, true);
  935.         window.removeEventListener("unload", webdeveloper_pageUnload, true);
  936.     }
  937.     catch(exception)
  938.     {
  939.         // Do nothing
  940.     }
  941.  
  942.     window.addEventListener("load", webdeveloper_pageLoad, true);
  943.     window.addEventListener("unload", webdeveloper_pageUnload, true);
  944. }
  945.  
  946. // Loads the given URL
  947. function webdeveloper_loadURL(url)
  948. {
  949.     const oldTab             = getBrowser().selectedTab;
  950.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  951.  
  952.     webdeveloper_generatePage(url);
  953.  
  954.     // If the open tabs in background preference is set to true
  955.     if(preferencesService.prefHasUserValue("webdeveloper.open.tabs.background") && preferencesService.getBoolPref("webdeveloper.open.tabs.background"))
  956.     {
  957.         getBrowser().selectedTab = oldTab;
  958.     }
  959. }
  960.  
  961. // Displays the options dialog
  962. function webdeveloper_options()
  963. {
  964.     window.openDialog("chrome://webdeveloper/content/options/options.xul", "webdeveloper-options-dialog", "centerscreen,chrome,modal");
  965.  
  966.     webdeveloper_changeOptions();
  967. }
  968.  
  969. // Handles the page being loaded
  970. function webdeveloper_pageLoad(event)
  971. {
  972.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  973.  
  974.     var disable = false;
  975.  
  976.     // If the disabled preference is set
  977.     if(preferencesService.prefHasUserValue("webdeveloper.disabled"))
  978.     {
  979.         disable = preferencesService.getBoolPref("webdeveloper.disabled");
  980.     }
  981.  
  982.     // If the page is the target and the URI matches
  983.     if(event.originalTarget && event.target && event.target.contentDocument && event.target.getAttribute && event.target.getAttribute("id") == "content" && event.originalTarget.documentURI == event.target.contentDocument.documentURI)
  984.     {
  985.         const stringBundle = document.getElementById("webdeveloper-string-bundle");
  986.  
  987.         webdeveloper_changeOptions();
  988.  
  989.         // If the extension should be disabled, but is not
  990.         if(disable && document.getElementById("webdeveloper-toggle-statusbar").getAttribute("tooltiptext") == stringBundle.getString("webdeveloper_disable"))
  991.         {
  992.             webdeveloper_disable(true);
  993.         }
  994.         else if(!disable)
  995.         {
  996.             const disableCachePreference        = !preferencesService.getBoolPref("browser.cache.disk.enable") && !preferencesService.getBoolPref("browser.cache.memory.enable");
  997.             const disableJavaPreference         = !preferencesService.getBoolPref("security.enable_java");
  998.             const disableJavaScriptPreference   = !preferencesService.getBoolPref("javascript.enabled");
  999.             const disablePageColorsPreference   = !preferencesService.getBoolPref("browser.display.use_document_colors");
  1000.             const disablePopupBlockerPreference = !preferencesService.getBoolPref("dom.disable_open_during_load");
  1001.  
  1002.             var disableCookiesPreference         = false;
  1003.             var disableImagesPreference          = false;
  1004.             var disableImageAnimationsPreference = false;
  1005.             var disableReferrerPreference        = false;
  1006.             var element                          = null;
  1007.             var persistStyles                    = false;
  1008.  
  1009.             // If not already listening to the console
  1010.             if(!webdeveloper_javaScriptConsoleListener)
  1011.             {
  1012.                 const consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService().QueryInterface(Components.interfaces.nsIConsoleService);
  1013.  
  1014.                 // Try to unregister the listener
  1015.                 try
  1016.                 {
  1017.                     consoleService.unregisterListener(WebDeveloperJavaScriptConsoleListener);
  1018.                 }
  1019.                 catch(exception)
  1020.                 {
  1021.                     // Do nothing
  1022.                 }
  1023.  
  1024.                 consoleService.registerListener(WebDeveloperJavaScriptConsoleListener);
  1025.  
  1026.                 webdeveloper_javaScriptConsoleListener = true;
  1027.             }
  1028.  
  1029.             // Try to get the cookie preference
  1030.             try
  1031.             {
  1032.                 // If the preference is set to 2
  1033.                 if(preferencesService.getIntPref("network.cookie.cookieBehavior") == 2)
  1034.                 {
  1035.                     disableCookiesPreference = true;
  1036.                 }
  1037.             }
  1038.             catch(exception)
  1039.             {
  1040.                 disableCookiesPreference = !preferencesService.getBoolPref("network.cookie.enable");
  1041.             }
  1042.  
  1043.             // If the image animation preference is set to none
  1044.             if(preferencesService.getCharPref("image.animation_mode") == "none")
  1045.             {
  1046.                 disableImageAnimationsPreference = true;
  1047.             }
  1048.  
  1049.             // If the image preference exists and is set to 2
  1050.             if(preferencesService.prefHasUserValue("network.image.imageBehavior") && preferencesService.getIntPref("network.image.imageBehavior") == 2)
  1051.             {
  1052.                 disableImagesPreference = true;
  1053.             }
  1054.  
  1055.             // If the referrer preference is set to 0
  1056.             if(preferencesService.getIntPref("network.http.sendRefererHeader") == 0)
  1057.             {
  1058.                 disableReferrerPreference = true;
  1059.             }
  1060.  
  1061.             // If the DOM inspector is not available
  1062.             if(!Components.classes["@mozilla.org/inspector/dom-utils;1"])
  1063.             {
  1064.                 element = document.getElementById("webdeveloper-view-style-information-menu");
  1065.  
  1066.                 // If the view style information menu is enabled
  1067.                 if(!element.getAttribute("disabled"))
  1068.                 {
  1069.                     webdeveloper_configureEquivalentElements(element, "disabled", true);
  1070.                 }
  1071.  
  1072.                 element = document.getElementById("webdeveloper-view-style-information-key");
  1073.  
  1074.                 // If the view style information key is enabled
  1075.                 if(!element.getAttribute("disabled"))
  1076.                 {
  1077.                     webdeveloper_disableElement(element, true);
  1078.                 }
  1079.  
  1080.                 element = document.getElementById("webdeveloper-open-dom-inspector-menu");
  1081.  
  1082.                 // If the open DOM inspector menu is enabled
  1083.                 if(!element.getAttribute("disabled"))
  1084.                 {
  1085.                     webdeveloper_configureEquivalentElements(element, "disabled", true);
  1086.                 }
  1087.             }
  1088.  
  1089.             element = document.getElementById("webdeveloper-disable-cache-menu");
  1090.             webdeveloper_configureEquivalentElements(element, "checked", disableCachePreference);
  1091.  
  1092.             element = document.getElementById("webdeveloper-disable-cookies-menu");
  1093.             webdeveloper_configureEquivalentElements(element, "checked", disableCookiesPreference);
  1094.  
  1095.             element = document.getElementById("webdeveloper-disable-image-animations-menu");
  1096.             webdeveloper_configureEquivalentElements(element, "checked", disableImageAnimationsPreference);
  1097.  
  1098.             element = document.getElementById("webdeveloper-disable-images-menu");
  1099.             webdeveloper_configureEquivalentElements(element, "checked", disableImagesPreference);
  1100.  
  1101.             element = document.getElementById("webdeveloper-disable-java-menu");
  1102.             webdeveloper_configureEquivalentElements(element, "checked", disableJavaPreference);
  1103.  
  1104.             element = document.getElementById("webdeveloper-disable-javascript-menu");
  1105.             webdeveloper_configureEquivalentElements(element, "checked", disableJavaScriptPreference);
  1106.  
  1107.             element = document.getElementById("webdeveloper-disable-page-colors-menu");
  1108.             webdeveloper_configureEquivalentElements(element, "checked", disablePageColorsPreference);
  1109.  
  1110.             element = document.getElementById("webdeveloper-disable-popup-blocker-menu");
  1111.             webdeveloper_configureEquivalentElements(element, "checked", disablePopupBlockerPreference);
  1112.  
  1113.             element = document.getElementById("webdeveloper-disable-referrer-logging-menu");
  1114.             webdeveloper_configureEquivalentElements(element, "checked", disableReferrerPreference);
  1115.  
  1116.             element = document.getElementById("webdeveloper-open-java-console-key");
  1117.             webdeveloper_configureEquivalentElements(element, "disabled", disableJavaPreference);
  1118.  
  1119.             element = document.getElementById("webdeveloper-open-java-console-menu");
  1120.             webdeveloper_configureEquivalentElements(element, "disabled", disableJavaPreference);
  1121.  
  1122.             // If the persist styles preference is set and is true
  1123.             if(preferencesService.prefHasUserValue("webdeveloper.styles.persist") && preferencesService.getBoolPref("webdeveloper.styles.persist"))
  1124.             {
  1125.                 persistStyles = true;
  1126.  
  1127.                 webdeveloper_applyStyleSheets(true);
  1128.             }
  1129.             else
  1130.             {
  1131.                 webdeveloper_appliedStyles = new Array();
  1132.                 webdeveloper_resetMenu(true);
  1133.             }
  1134.  
  1135.             element = document.getElementById("webdeveloper-persist-styles-menu");
  1136.             webdeveloper_configureEquivalentElements(element, "checked", persistStyles);
  1137.  
  1138.             webdeveloper_updateJavaScriptStatus();
  1139.             webdeveloper_updateRenderMode();
  1140.         }
  1141.     }
  1142. }
  1143.  
  1144. // Handles the page being unloaded
  1145. function webdeveloper_pageUnload(event)
  1146. {
  1147.     // If the page is the target and the URI matches
  1148.     if(event.originalTarget && event.target && event.target.contentDocument && event.target.getAttribute && event.target.getAttribute("id") == "content" && event.originalTarget.documentURI == event.target.contentDocument.documentURI)
  1149.     {
  1150.         webdeveloper_resetJavaScriptStatus();
  1151.     }
  1152. }
  1153.  
  1154. // Remove applied style
  1155. function webdeveloper_removeAppliedStyle(id)
  1156. {
  1157.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  1158.  
  1159.     // If the persist styles preference is set and is true
  1160.     if(preferencesService.prefHasUserValue("webdeveloper.styles.persist") && preferencesService.getBoolPref("webdeveloper.styles.persist"))
  1161.     {
  1162.         // Loop through the applied styles
  1163.         for(var i = 0; i < webdeveloper_appliedStyles.length; i++)
  1164.         {
  1165.             // If this style sheet is in the applied styles
  1166.             if(webdeveloper_appliedStyles[i] == id)
  1167.             {
  1168.                 webdeveloper_appliedStyles.splice(i, 1);
  1169.             }
  1170.         }
  1171.     }
  1172. }
  1173.  
  1174. // Removes all the generated menu items from the menu
  1175. function webdeveloper_removeGeneratedMenuItems(menu)
  1176. {
  1177.     var menuItem  = null;
  1178.     var menuItems = menu.getElementsByAttribute("class", "webdeveloper-generated-menu");
  1179.  
  1180.     // Loop through the menu items
  1181.     for(var i = 0; i < menuItems.length; i++)
  1182.     {
  1183.         menu.removeChild(menuItems[i]);
  1184.     }
  1185.  
  1186.     menuItems = menu.getElementsByAttribute("class", "webdeveloper-generated-menu");
  1187.  
  1188.     // Loop through the menu items again because of the change to the behavior of getElementsByAttribute
  1189.     while(menuItems.length > 0)
  1190.     {
  1191.         menu.removeChild(menuItems[0]);
  1192.     }
  1193. }
  1194.  
  1195. // Removes the style sheet with the given id
  1196. function webdeveloper_removeStyleSheet(id, applyStyle)
  1197. {
  1198.     const content      = window.document.getElementById("content");
  1199.     const mainTabBox   = content.mTabBox;
  1200.     const documentList = webdeveloper_getDocuments(content.browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  1201.  
  1202.     var element      = null;
  1203.     var pageDocument = null;
  1204.  
  1205.     // Loop through the documents
  1206.     for(var i = 0; i < documentList.length; i++)
  1207.     {
  1208.         pageDocument = documentList[i];
  1209.  
  1210.         // Remove all elements with that id
  1211.         while((element = pageDocument.getElementById(id)) != null)
  1212.         {
  1213.             element.parentNode.removeChild(element);
  1214.         }
  1215.     }
  1216.  
  1217.     // If applying style
  1218.     if(applyStyle)
  1219.     {
  1220.         webdeveloper_removeAppliedStyle(id);
  1221.     }
  1222. }
  1223.  
  1224. // Resets the JavaScript status button
  1225. function webdeveloper_resetJavaScriptStatus()
  1226. {
  1227.     const javaScriptButton = document.getElementById("webdeveloper-javascript-statusbar");
  1228.  
  1229.     webdeveloper_javaScriptError   = false;
  1230.     webdeveloper_javaScriptWarning = false;
  1231.  
  1232.     // If the JavaScript button exists
  1233.     if(javaScriptButton)
  1234.     {
  1235.         const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  1236.         const stringBundle       = document.getElementById("webdeveloper-string-bundle");
  1237.  
  1238.         javaScriptButton.setAttribute("class", "webdeveloper-statusbar-button");
  1239.         javaScriptButton.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_javaScriptNoErrorsTooltip"));
  1240.  
  1241.         // If the toolbar preference has a value and is set to text
  1242.         if(preferencesService.prefHasUserValue("webdeveloper.toolbar.icons") && preferencesService.getCharPref("webdeveloper.toolbar.icons") == "text")
  1243.         {
  1244.             javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javaScriptNoErrorsLabel"));
  1245.         }
  1246.     }
  1247. }
  1248.  
  1249. // Resets the menu
  1250. function webdeveloper_resetMenu(disableStylesMenu)
  1251. {
  1252.     var element = document.getElementById("webdeveloper-add-user-style-sheet-menu");
  1253.  
  1254.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1255.  
  1256.     // If including the disable styles menu
  1257.     if(disableStylesMenu)
  1258.     {
  1259.         element = document.getElementById("webdeveloper-disable-all-styles-menu");
  1260.         webdeveloper_configureEquivalentElements(element, "checked", false);
  1261.         webdeveloper_configureEquivalentElements(element, "disabled", false);
  1262.  
  1263.         element = document.getElementById("webdeveloper-disable-embedded-styles-menu");
  1264.         webdeveloper_configureEquivalentElements(element, "checked", false);
  1265.         webdeveloper_configureEquivalentElements(element, "disabled", false);
  1266.  
  1267.         element = document.getElementById("webdeveloper-disable-inline-styles-menu");
  1268.         webdeveloper_configureEquivalentElements(element, "checked", false);
  1269.         webdeveloper_configureEquivalentElements(element, "disabled", false);
  1270.  
  1271.         element = document.getElementById("webdeveloper-disable-linked-styles-menu");
  1272.         webdeveloper_configureEquivalentElements(element, "checked", false);
  1273.         webdeveloper_configureEquivalentElements(element, "disabled", false);
  1274.     }
  1275.  
  1276.     element = document.getElementById("webdeveloper-disable-default-styles-menu");
  1277.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1278.  
  1279.     element = document.getElementById("webdeveloper-disable-embedded-styles-menu");
  1280.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1281.  
  1282.     element = document.getElementById("webdeveloper-disable-inline-styles-menu");
  1283.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1284.  
  1285.     element = document.getElementById("webdeveloper-display-access-keys-menu");
  1286.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1287.  
  1288.     element = document.getElementById("webdeveloper-display-anchors-menu");
  1289.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1290.  
  1291.     element = document.getElementById("webdeveloper-display-block-size-menu");
  1292.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1293.  
  1294.     element = document.getElementById("webdeveloper-display-current-size-title-menu");
  1295.  
  1296.     // If the display current size in title menu is checked
  1297.     if(element.getAttribute("checked"))
  1298.     {
  1299.         window.onresize = null;
  1300.     }
  1301.  
  1302.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1303.  
  1304.     element = document.getElementById("webdeveloper-display-form-details-menu");
  1305.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1306.  
  1307.     element = document.getElementById("webdeveloper-display-id-class-details-menu");
  1308.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1309.  
  1310.     element = document.getElementById("webdeveloper-display-image-dimensions-menu");
  1311.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1312.  
  1313.     element = document.getElementById("webdeveloper-display-image-file-sizes-menu");
  1314.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1315.  
  1316.     element = document.getElementById("webdeveloper-display-image-paths-menu");
  1317.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1318.  
  1319.     element = document.getElementById("webdeveloper-display-link-paths-menu");
  1320.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1321.  
  1322.     element = document.getElementById("webdeveloper-display-tab-index-menu");
  1323.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1324.  
  1325.     element = document.getElementById("webdeveloper-display-topographic-information-menu");
  1326.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1327.  
  1328.     element = document.getElementById("webdeveloper-hide-background-images-menu");
  1329.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1330.  
  1331.     element = document.getElementById("webdeveloper-hide-images-menu");
  1332.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1333.  
  1334.     element = document.getElementById("webdeveloper-linearize-page-menu");
  1335.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1336.  
  1337.     element = document.getElementById("webdeveloper-make-images-invisible-menu");
  1338.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1339.  
  1340.     element = document.getElementById("webdeveloper-outline-block-level-elements-menu");
  1341.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1342.  
  1343.     element = document.getElementById("webdeveloper-outline-custom-elements-menu");
  1344.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1345.  
  1346.     element = document.getElementById("webdeveloper-outline-deprecated-elements-menu");
  1347.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1348.  
  1349.     element = document.getElementById("webdeveloper-outline-frames-menu");
  1350.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1351.  
  1352.     element = document.getElementById("webdeveloper-outline-images-with-adjusted-dimensions-menu");
  1353.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1354.  
  1355.     element = document.getElementById("webdeveloper-outline-images-with-empty-alt-attributes-menu");
  1356.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1357.  
  1358.     element = document.getElementById("webdeveloper-outline-images-without-alt-attributes-menu");
  1359.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1360.  
  1361.     element = document.getElementById("webdeveloper-outline-images-without-dimensions-menu");
  1362.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1363.  
  1364.     element = document.getElementById("webdeveloper-outline-images-without-title-attributes-menu");
  1365.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1366.  
  1367.     element = document.getElementById("webdeveloper-outline-links-without-title-attributes-menu");
  1368.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1369.  
  1370.     element = document.getElementById("webdeveloper-outline-table-cells-menu");
  1371.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1372.  
  1373.     element = document.getElementById("webdeveloper-outline-tables-menu");
  1374.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1375.  
  1376.     element = document.getElementById("webdeveloper-replace-images-with-alt-attributes-menu");
  1377.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1378.  
  1379.     element = document.getElementById("webdeveloper-show-comments-menu");
  1380.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1381.  
  1382.     element = document.getElementById("webdeveloper-use-border-box-model-menu");
  1383.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1384.  
  1385.     element = document.getElementById("webdeveloper-view-style-information-menu");
  1386.     webdeveloper_configureEquivalentElements(element, "checked", false);
  1387. }
  1388.  
  1389. // Resets the page
  1390. function webdeveloper_resetPage()
  1391. {
  1392.     webdeveloper_resetMenu(true);
  1393.     webdeveloper_applyStyleSheets(false);
  1394.  
  1395.     webdeveloper_appliedStyles    = new Array();
  1396.     webdeveloper_outlinedElements = new Array();
  1397. }
  1398.  
  1399. // Retrieves the style sheet text from a style sheet
  1400. function webdeveloper_retrieveStyleSheetText(pageDocument, styleSheet)
  1401. {
  1402.     const mediaList      = styleSheet.media.mediaText;
  1403.     const ownerNode      = styleSheet.ownerNode;
  1404.     const request        = new XMLHttpRequest();
  1405.     const styleSheetHref = styleSheet.href;
  1406.  
  1407.     var cssRule    = null;
  1408.     var stylesText = "";
  1409.  
  1410.     // If this style sheet is for the screen and is not an alternate style sheet
  1411.     if((!mediaList || mediaList.indexOf("screen") != -1 || mediaList.indexOf("all") != -1) && (!ownerNode || ownerNode.getAttribute("rel") != "alternate stylesheet"))
  1412.     {
  1413.         // If the style sheet href is the current document
  1414.         if(styleSheetHref == pageDocument.documentURI)
  1415.         {
  1416.             const stringBundle = document.getElementById("webdeveloper-string-bundle");
  1417.  
  1418.             stylesText += "/* " + stringBundle.getFormattedString("webdeveloper_inlineStyles", [styleSheetHref]) + " */\n\n";
  1419.  
  1420.             // Loop through the the style sheet rules
  1421.             for(var k = 0; k < styleSheet.cssRules.length; k++)
  1422.             {
  1423.                 cssRule = styleSheet.cssRules[k];
  1424.  
  1425.                 // If this is not an import rule
  1426.                 if(cssRule.type != 3)
  1427.                 {
  1428.                     stylesText += cssRule.cssText + "\n\n";
  1429.                 }
  1430.             }
  1431.         }
  1432.         else
  1433.         {
  1434.             request.open("GET", styleSheetHref, false);
  1435.             request.send("");
  1436.  
  1437.             stylesText += "/*  " + styleSheetHref + " */\n\n";
  1438.             stylesText += request.responseText;
  1439.         }
  1440.  
  1441.         // Loop through the the style sheet rules
  1442.         for(k = 0; k < styleSheet.cssRules.length; k++)
  1443.         {
  1444.             cssRule = styleSheet.cssRules[k];
  1445.  
  1446.             // If this is an import rule
  1447.             if(cssRule.type == 3)
  1448.             {
  1449.                 stylesText += webdeveloper_retrieveStyleSheetText(pageDocument, cssRule.styleSheet);
  1450.             }
  1451.         }
  1452.     }
  1453.  
  1454.     return stylesText;
  1455. }
  1456.  
  1457. // Sets up the default options
  1458. function webdeveloper_setupDefaultOptions()
  1459. {
  1460.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  1461.  
  1462.     // If the open tabs preference is not set
  1463.     if(!preferencesService.prefHasUserValue("webdeveloper.open.tabs"))
  1464.     {
  1465.         // If the open windows preference is set
  1466.         if(preferencesService.prefHasUserValue("webdeveloper.open.windows"))
  1467.         {
  1468.             preferencesService.setBoolPref("webdeveloper.open.tabs", !preferencesService.getBoolPref("webdeveloper.open.windows"));
  1469.             preferencesService.clearUserPref("webdeveloper.open.windows");
  1470.         }
  1471.         else
  1472.         {
  1473.             preferencesService.setBoolPref("webdeveloper.open.tabs", true);
  1474.         }
  1475.     }
  1476.  
  1477.     // Set default edit CSS settings
  1478.     if(!preferencesService.prefHasUserValue("webdeveloper.edit.css.font"))
  1479.     {
  1480.         preferencesService.setIntPref("webdeveloper.edit.css.font", 12);
  1481.     }
  1482.     if(!preferencesService.prefHasUserValue("webdeveloper.edit.css.color.text"))
  1483.     {
  1484.         preferencesService.setCharPref("webdeveloper.edit.css.color.text", "#000000");
  1485.     }
  1486.     if(!preferencesService.prefHasUserValue("webdeveloper.edit.css.color.background"))
  1487.     {
  1488.         preferencesService.setCharPref("webdeveloper.edit.css.color.background", "#ffffff");
  1489.     }
  1490.     if(!preferencesService.prefHasUserValue("webdeveloper.edit.css.update.frequency"))
  1491.     {
  1492.         preferencesService.setIntPref("webdeveloper.edit.css.update.frequency", 1000);
  1493.     }
  1494.  
  1495.     // Set default custom colors
  1496.     if(!preferencesService.prefHasUserValue("webdeveloper.custom.1.color"))
  1497.     {
  1498.         preferencesService.setCharPref("webdeveloper.custom.1.color", "#ff0000");
  1499.     }
  1500.     if(!preferencesService.prefHasUserValue("webdeveloper.custom.2.color"))
  1501.     {
  1502.         preferencesService.setCharPref("webdeveloper.custom.2.color", "#33ff33");
  1503.     }
  1504.     if(!preferencesService.prefHasUserValue("webdeveloper.custom.3.color"))
  1505.     {
  1506.         preferencesService.setCharPref("webdeveloper.custom.3.color", "#3333ff");
  1507.     }
  1508.     if(!preferencesService.prefHasUserValue("webdeveloper.custom.4.color"))
  1509.     {
  1510.         preferencesService.setCharPref("webdeveloper.custom.4.color", "#ff0000");
  1511.     }
  1512.     if(!preferencesService.prefHasUserValue("webdeveloper.custom.5.color"))
  1513.     {
  1514.         preferencesService.setCharPref("webdeveloper.custom.5.color", "#33ff33");
  1515.     }
  1516.  
  1517.     // Set default feature tooltip colors
  1518.     if(!preferencesService.prefHasUserValue("webdeveloper.color.feature.tooltip.text"))
  1519.     {
  1520.         preferencesService.setCharPref("webdeveloper.color.feature.tooltip.text", "#000000");
  1521.     }
  1522.     if(!preferencesService.prefHasUserValue("webdeveloper.color.feature.tooltip.background"))
  1523.     {
  1524.         preferencesService.setCharPref("webdeveloper.color.feature.tooltip.background", "#ffff99");
  1525.     }
  1526.     if(!preferencesService.prefHasUserValue("webdeveloper.feature.tooltip.opacity"))
  1527.     {
  1528.         preferencesService.setCharPref("webdeveloper.feature.tooltip.opacity", "0.7");
  1529.     }
  1530.  
  1531.     // Set default ID & class colors
  1532.     if(!preferencesService.prefHasUserValue("webdeveloper.color.class.text"))
  1533.     {
  1534.         preferencesService.setCharPref("webdeveloper.color.class.text", "#ffffff");
  1535.     }
  1536.     if(!preferencesService.prefHasUserValue("webdeveloper.color.class.background"))
  1537.     {
  1538.         preferencesService.setCharPref("webdeveloper.color.class.background", "#990000");
  1539.     }
  1540.     if(!preferencesService.prefHasUserValue("webdeveloper.color.id.text"))
  1541.     {
  1542.         preferencesService.setCharPref("webdeveloper.color.id.text", "#ffffff");
  1543.     }
  1544.     if(!preferencesService.prefHasUserValue("webdeveloper.color.id.background"))
  1545.     {
  1546.         preferencesService.setCharPref("webdeveloper.color.id.background", "#009900");
  1547.     }
  1548.     if(!preferencesService.prefHasUserValue("webdeveloper.color.id.class.text"))
  1549.     {
  1550.         preferencesService.setCharPref("webdeveloper.color.id.class.text", "#ffffff");
  1551.     }
  1552.     if(!preferencesService.prefHasUserValue("webdeveloper.color.id.class.background"))
  1553.     {
  1554.         preferencesService.setCharPref("webdeveloper.color.id.class.background", "#000099");
  1555.     }
  1556.  
  1557.     // Set default resize sizes
  1558.     if(!preferencesService.prefHasUserValue("webdeveloper.resize.count"))
  1559.     {
  1560.         preferencesService.setIntPref("webdeveloper.resize.count", 4);
  1561.     }
  1562.     if(!preferencesService.prefHasUserValue("webdeveloper.resize.1.description"))
  1563.     {
  1564.         preferencesService.setCharPref("webdeveloper.resize.1.description", "800x600");
  1565.     }
  1566.     if(!preferencesService.prefHasUserValue("webdeveloper.resize.1.width"))
  1567.     {
  1568.         preferencesService.setIntPref("webdeveloper.resize.1.width", 800);
  1569.     }
  1570.     if(!preferencesService.prefHasUserValue("webdeveloper.resize.1.height"))
  1571.     {
  1572.         preferencesService.setIntPref("webdeveloper.resize.1.height", 600);
  1573.     }
  1574.  
  1575.     // Set default tidied HTML settings
  1576.     if(!preferencesService.prefHasUserValue("webdeveloper.tidied.html.close.br"))
  1577.     {
  1578.         preferencesService.setBoolPref("webdeveloper.tidied.html.close.br", true);
  1579.     }
  1580.     if(!preferencesService.prefHasUserValue("webdeveloper.tidied.html.escape.ampersand"))
  1581.     {
  1582.         preferencesService.setBoolPref("webdeveloper.tidied.html.escape.ampersand", true);
  1583.     }
  1584.  
  1585.     // Set default tool count
  1586.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.count"))
  1587.     {
  1588.         preferencesService.setIntPref("webdeveloper.tool.count", 7);
  1589.     }
  1590.  
  1591.     // Set CSS validator
  1592.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.1.description"))
  1593.     {
  1594.         preferencesService.setCharPref("webdeveloper.tool.1.description", "Validate CSS");
  1595.     }
  1596.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.1.url"))
  1597.     {
  1598.         preferencesService.setCharPref("webdeveloper.tool.1.url", "http://jigsaw.w3.org/css-validator/validator?profile=css2&warning=2&uri=");
  1599.     }
  1600.  
  1601.     // Set feed validator
  1602.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.2.description"))
  1603.     {
  1604.         preferencesService.setCharPref("webdeveloper.tool.2.description", "Validate Feed");
  1605.     }
  1606.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.2.url"))
  1607.     {
  1608.         preferencesService.setCharPref("webdeveloper.tool.2.url", "http://feedvalidator.org/check.cgi?url=");
  1609.     }
  1610.  
  1611.     // Set HTML validator
  1612.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.3.description"))
  1613.     {
  1614.         preferencesService.setCharPref("webdeveloper.tool.3.description", "Validate HTML");
  1615.     }
  1616.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.3.key"))
  1617.     {
  1618.         preferencesService.setCharPref("webdeveloper.tool.3.key", "H");
  1619.     }
  1620.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.3.url"))
  1621.     {
  1622.         preferencesService.setCharPref("webdeveloper.tool.3.url", "http://validator.w3.org/check?verbose=1&uri=");
  1623.     }
  1624.  
  1625.     // Set links validator
  1626.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.4.description"))
  1627.     {
  1628.         preferencesService.setCharPref("webdeveloper.tool.4.description", "Validate Links");
  1629.     }
  1630.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.4.url"))
  1631.     {
  1632.         preferencesService.setCharPref("webdeveloper.tool.4.url", "http://validator.w3.org/checklink?check=Check&hide_type=all&summary=on&uri=");
  1633.     }
  1634.  
  1635.     // Set section 508 validator
  1636.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.5.description"))
  1637.     {
  1638.         preferencesService.setCharPref("webdeveloper.tool.5.description", "Validate Section 508");
  1639.     }
  1640.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.5.url"))
  1641.     {
  1642.         preferencesService.setCharPref("webdeveloper.tool.5.url", "http://www.contentquality.com/mynewtester/cynthia.exe?rptmode=-1&url1=");
  1643.     }
  1644.  
  1645.     // Set WAI validator
  1646.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.6.description"))
  1647.     {
  1648.         preferencesService.setCharPref("webdeveloper.tool.6.description", "Validate WAI");
  1649.     }
  1650.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.6.url"))
  1651.     {
  1652.         preferencesService.setCharPref("webdeveloper.tool.6.url", "http://www.contentquality.com/mynewtester/cynthia.exe?rptmode=2&url1=");
  1653.     }
  1654.  
  1655.     // Set speed report
  1656.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.7.description"))
  1657.     {
  1658.         preferencesService.setCharPref("webdeveloper.tool.7.description", "View Speed Report");
  1659.     }
  1660.     if(!preferencesService.prefHasUserValue("webdeveloper.tool.7.url"))
  1661.     {
  1662.         preferencesService.setCharPref("webdeveloper.tool.7.url", "http://www.websiteoptimization.com/cgi-bin/wso/wso.pl?url=");
  1663.     }
  1664. }
  1665.  
  1666. // Sorts two cookies
  1667. function webdeveloper_sortCookies(cookieOne, cookieTwo)
  1668. {
  1669.     const cookieOneHost = cookieOne.host;
  1670.     const cookieOneName = cookieOne.name;
  1671.     const cookieTwoHost = cookieTwo.host;
  1672.     const cookieTwoName = cookieOne.name;
  1673.  
  1674.     var sortValue = 1;
  1675.  
  1676.     // If the cookies are equal
  1677.     if(cookieOneHost == cookieTwoHost && cookieOneName == cookieTwoName)
  1678.     {
  1679.         sortValue = 0;
  1680.     }
  1681.     else if(cookieOneHost < cookieTwoHost || (cookieOneHost == cookieTwoHost && cookieOneName < cookieTwoName))
  1682.     {
  1683.         sortValue = -1;
  1684.     }
  1685.  
  1686.     return sortValue;
  1687. }
  1688.  
  1689. // Handles a tab being selected
  1690. function webdeveloper_tabSelect(event)
  1691. {
  1692.     const selectedTab = window.document.getElementById("content").mTabBox.selectedIndex;
  1693.  
  1694.     // If the selected tab is different
  1695.     if(selectedTab != webdeveloper_selectedTab)
  1696.     {
  1697.         const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  1698.  
  1699.         webdeveloper_selectedTab = selectedTab;
  1700.  
  1701.         webdeveloper_updateMenu();
  1702.         webdeveloper_updateRenderMode();
  1703.         webdeveloper_resetJavaScriptStatus();
  1704.     }
  1705. }
  1706.  
  1707. // Toggles the feature tooltip styles
  1708. function webdeveloper_toggleFeatureTooltipStyles(element, styleSheetId, selectors)
  1709. {
  1710.     webdeveloper_removeStyleSheet(styleSheetId, false);
  1711.  
  1712.     // If the menu is checked
  1713.     if(element.getAttribute("checked"))
  1714.     {
  1715.         const content            = window.document.getElementById("content");
  1716.         const mainTabBox         = content.mTabBox;
  1717.         const documentList       = webdeveloper_getDocuments(content.browsers[mainTabBox.selectedIndex].contentWindow, new Array());
  1718.         const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  1719.         const colors             = " background-color: " + preferencesService.getCharPref("webdeveloper.color.feature.tooltip.background") + " !important; color: " + preferencesService.getCharPref("webdeveloper.color.feature.tooltip.text") + " !important; ";
  1720.         const opacity            = " -moz-opacity: " + preferencesService.getCharPref("webdeveloper.feature.tooltip.opacity") + " !important; ";
  1721.  
  1722.         var headElementList = null;
  1723.         var pageDocument    = null;
  1724.         var styleElement    = null;
  1725.  
  1726.         // Loop through the documents
  1727.         for(var i = 0; i < documentList.length; i++)
  1728.         {
  1729.             pageDocument    = documentList[i];
  1730.             headElementList = pageDocument.getElementsByTagName("head");
  1731.             styleElement    = pageDocument.createElement("style");
  1732.  
  1733.             styleElement.appendChild(pageDocument.createTextNode(selectors + " {" + colors + opacity + "}"));
  1734.             styleElement.setAttribute("id", styleSheetId);
  1735.             styleElement.setAttribute("type", "text/css");
  1736.  
  1737.             // If there is a head element
  1738.             if(headElementList.length > 0)
  1739.             {
  1740.                 headElementList[0].appendChild(styleElement);
  1741.             }
  1742.             else
  1743.             {
  1744.                 pageDocument.documentElement.appendChild(styleElement);
  1745.             }
  1746.         }
  1747.     }
  1748. }
  1749.  
  1750. // Toggles an individual style sheet
  1751. function webdeveloper_toggleIndividualStyleSheet(selectedStyleSheetHref)
  1752. {
  1753.     const content         = window.document.getElementById("content");
  1754.     const mainTabBox      = content.mTabBox;
  1755.     const currentDocument = content.browsers[mainTabBox.selectedIndex].contentDocument;
  1756.  
  1757.     var styleSheet     = null;
  1758.     var styleSheetHref = null;
  1759.     var styleSheetList = currentDocument.styleSheets;
  1760.  
  1761.     // Loop through the style sheets
  1762.     for(var i = 0; i < styleSheetList.length; i++)
  1763.     {
  1764.         styleSheet     = styleSheetList[i];
  1765.         styleSheetHref = styleSheet.href;
  1766.  
  1767.         // If this is the selected style sheet
  1768.         if(styleSheetHref == selectedStyleSheetHref)
  1769.         {
  1770.             styleSheet.disabled = !styleSheet.disabled;
  1771.         }
  1772.     }
  1773. }
  1774.  
  1775. // Toggles the style sheet with the given id
  1776. function webdeveloper_toggleStyleSheet(element, location, id, applyStyle)
  1777. {
  1778.     const checked = element.getAttribute("checked");
  1779.  
  1780.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1781.     webdeveloper_removeStyleSheet(id, applyStyle);
  1782.  
  1783.     // If the menu is checked
  1784.     if(checked)
  1785.     {
  1786.         webdeveloper_addStyleSheet(location, id, applyStyle);
  1787.     }
  1788. }
  1789.  
  1790. // Toggles the toolbar
  1791. function webdeveloper_toggleToolbar()
  1792. {
  1793.     const toolbar = document.getElementById("webdeveloper-toolbar");
  1794.  
  1795.     toolbar.collapsed = !toolbar.collapsed;
  1796. }
  1797.  
  1798. // Updates the JavaScript status
  1799. function webdeveloper_updateJavaScriptStatus()
  1800. {
  1801.     const javaScriptButton   = document.getElementById("webdeveloper-javascript-statusbar");
  1802.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  1803.     const stringBundle       = document.getElementById("webdeveloper-string-bundle");
  1804.  
  1805.     var textToolbar = false;
  1806.  
  1807.     // If the toolbar preference has a value and is set to text
  1808.     if(preferencesService.prefHasUserValue("webdeveloper.toolbar.icons") && preferencesService.getCharPref("webdeveloper.toolbar.icons") == "text")
  1809.     {
  1810.         textToolbar = true;
  1811.     }
  1812.  
  1813.     // If there was an error
  1814.     if(webdeveloper_javaScriptError)
  1815.     {
  1816.         // If the JavaScript button is set
  1817.         if(javaScriptButton)
  1818.         {
  1819.             javaScriptButton.setAttribute("class", "error webdeveloper-statusbar-button");
  1820.             javaScriptButton.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_javaScriptErrorTooltip"));
  1821.  
  1822.             // If the toolbar is in text mode
  1823.             if(textToolbar)
  1824.             {
  1825.                 javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javascriptErrorLabel"));
  1826.             }
  1827.         }
  1828.  
  1829.         // If the open JavaScript console error preference is set
  1830.         if(preferencesService.prefHasUserValue("webdeveloper.open.javascript.console.error") && preferencesService.getBoolPref("webdeveloper.open.javascript.console.error"))
  1831.         {
  1832.             toJavaScriptConsole();
  1833.         }
  1834.     }
  1835.     else
  1836.     {
  1837.         // If the JavaScript button is set
  1838.         if(javaScriptButton)
  1839.         {
  1840.             javaScriptButton.setAttribute("class", "warning webdeveloper-statusbar-button");
  1841.             javaScriptButton.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_javaScriptWarningTooltip"));
  1842.  
  1843.             // If the toolbar is in text mode
  1844.             if(textToolbar)
  1845.             {
  1846.                 javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javascriptWarningLabel"));
  1847.             }
  1848.         }
  1849.  
  1850.         // If the open JavaScript console warning preference is set
  1851.         if(preferencesService.prefHasUserValue("webdeveloper.open.javascript.console.warning") && preferencesService.getBoolPref("webdeveloper.open.javascript.console.warning"))
  1852.         {
  1853.             toJavaScriptConsole();
  1854.         }
  1855.     }
  1856. }
  1857.  
  1858. // Updates the menu
  1859. function webdeveloper_updateMenu()
  1860. {
  1861.     const content                                       = window.document.getElementById("content");
  1862.     const currentDocument                               = content.browsers[content.mTabBox.selectedIndex].contentDocument;
  1863.     const addUserStylesheet                             = currentDocument.getElementById("webdeveloper-add-user-style-sheet");
  1864.     const disableDefaultStylesStylesheet                = currentDocument.getElementById("webdeveloper-disable-default-styles");
  1865.     const displayAccessKeysStylesheet                   = currentDocument.getElementById("webdeveloper-display-access-keys");
  1866.     const displayAnchorsStylesheet                      = currentDocument.getElementById("webdeveloper-display-anchors");
  1867.     const displayBlockSizeStylesheet                    = currentDocument.getElementById("webdeveloper-display-block-size");
  1868.     const displayCurrentSizeTitleStylesheet             = currentDocument.getElementById("webdeveloper-display-current-size-title");
  1869.     const displayFormDetailsStylesheet                  = currentDocument.getElementById("webdeveloper-display-form-details");
  1870.     const displayIDClassDetailsStylesheet               = currentDocument.getElementById("webdeveloper-display-id-class-details");
  1871.     const displayImageDimensionsStylesheet              = currentDocument.getElementById("webdeveloper-display-image-dimensions");
  1872.     const displayImageFileSizesStylesheet               = currentDocument.getElementById("webdeveloper-display-image-file-sizes");
  1873.     const displayImagePathsStylesheet                   = currentDocument.getElementById("webdeveloper-display-image-paths");
  1874.     const displayLinkPathsStylesheet                    = currentDocument.getElementById("webdeveloper-display-link-paths");
  1875.     const displayTabIndexStylesheet                     = currentDocument.getElementById("webdeveloper-display-tab-index");
  1876.     const displayTopographicInformationStylesheet       = currentDocument.getElementById("webdeveloper-display-tab-index");
  1877.     const hideBackgroundImagesStylesheet                = currentDocument.getElementById("webdeveloper-hide-background-images");
  1878.     const hideImagesStylesheet                          = currentDocument.getElementById("webdeveloper-hide-images");
  1879.     const linearizePageStylesheet                       = currentDocument.getElementById("webdeveloper-linearize-page");
  1880.     const makeImagesInvisibleStylesheet                 = currentDocument.getElementById("webdeveloper-make-images-invisible");
  1881.     const outlineBlockLevelElementsStylesheet           = currentDocument.getElementById("webdeveloper-outline-block-level-elements");
  1882.     const outlineCustomElementsStylesheet               = currentDocument.getElementById("webdeveloper-outline-custom-elements");
  1883.     const outlineDeprecatedElementsStylesheet           = currentDocument.getElementById("webdeveloper-outline-deprecated-elements");
  1884.     const outlineFramesStylesheet                       = currentDocument.getElementById("webdeveloper-outline-frames");
  1885.     const outlineImagesWithAdjustedDimensionsStylesheet = currentDocument.getElementById("webdeveloper-outline-images-with-adjusted-dimensions");
  1886.     const outlineImagesWithEmptyAltAttributesStylesheet = currentDocument.getElementById("webdeveloper-outline-images-with-empty-alt-attributes");
  1887.     const outlineImagesWithoutAltAttributesStylesheet   = currentDocument.getElementById("webdeveloper-outline-images-without-alt-attributes");
  1888.     const outlineImagesWithoutDimensionsStylesheet      = currentDocument.getElementById("webdeveloper-outline-images-without-dimensions");
  1889.     const outlineImagesWithoutTitleAttributesStylesheet = currentDocument.getElementById("webdeveloper-outline-images-without-title-attributes");
  1890.     const outlineLinksWithoutTitleAttributesStylesheet  = currentDocument.getElementById("webdeveloper-outline-links-without-title-attributes");
  1891.     const outlineSelectedElementStylesheet              = currentDocument.getElementById("webdeveloper-outline-selected-element");
  1892.     const outlineTableCellsStylesheet                   = currentDocument.getElementById("webdeveloper-outline-table-cells");
  1893.     const outlineTablesStylesheet                       = currentDocument.getElementById("webdeveloper-outline-tables");
  1894.     const replaceImagesWithAltAttributesStylesheet      = currentDocument.getElementById("webdeveloper-replace-images-with-alt-attributes");
  1895.     const showCommentsStylesheet                        = currentDocument.getElementById("webdeveloper-show-comments");
  1896.     const useBorderBoxModelStylesheet                   = currentDocument.getElementById("webdeveloper-use-border-box-model");
  1897.     const viewStyleInformationStylesheet                = currentDocument.getElementById("webdeveloper-view-style-information");
  1898.  
  1899.     var checked = false;
  1900.     var element = null;
  1901.  
  1902.     checked = addUserStylesheet && !addUserStylesheet.disabled;
  1903.     element = document.getElementById("webdeveloper-add-user-style-sheet-menu");
  1904.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1905.  
  1906.     checked = disableDefaultStylesStylesheet && !disableDefaultStylesStylesheet.disabled;
  1907.     element = document.getElementById("webdeveloper-disable-default-styles-menu");
  1908.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1909.  
  1910.     checked = displayAccessKeysStylesheet && !displayAccessKeysStylesheet.disabled;
  1911.     element = document.getElementById("webdeveloper-display-access-keys-menu");
  1912.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1913.  
  1914.     checked = displayAnchorsStylesheet && !displayAnchorsStylesheet.disabled;
  1915.     element = document.getElementById("webdeveloper-display-anchors-menu");
  1916.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1917.  
  1918.     checked = displayBlockSizeStylesheet && !displayBlockSizeStylesheet.disabled;
  1919.     element = document.getElementById("webdeveloper-display-block-size-menu");
  1920.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1921.  
  1922.     checked = displayCurrentSizeTitleStylesheet && !displayCurrentSizeTitleStylesheet.disabled;
  1923.     element = document.getElementById("webdeveloper-display-current-size-title-menu");
  1924.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1925.  
  1926.     checked = displayFormDetailsStylesheet && !displayFormDetailsStylesheet.disabled;
  1927.     element = document.getElementById("webdeveloper-display-form-details-menu");
  1928.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1929.  
  1930.     checked = displayIDClassDetailsStylesheet && !displayIDClassDetailsStylesheet.disabled;
  1931.     element = document.getElementById("webdeveloper-display-id-class-details-menu");
  1932.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1933.  
  1934.     checked = displayImageDimensionsStylesheet && !displayImageDimensionsStylesheet.disabled;
  1935.     element = document.getElementById("webdeveloper-display-image-dimensions-menu");
  1936.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1937.  
  1938.     checked = displayImageFileSizesStylesheet && !displayImageFileSizesStylesheet.disabled;
  1939.     element = document.getElementById("webdeveloper-display-image-file-sizes-menu");
  1940.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1941.  
  1942.     checked = displayImagePathsStylesheet && !displayImagePathsStylesheet.disabled;
  1943.     element = document.getElementById("webdeveloper-display-image-paths-menu");
  1944.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1945.  
  1946.     checked = displayLinkPathsStylesheet && !displayLinkPathsStylesheet.disabled;
  1947.     element = document.getElementById("webdeveloper-display-link-paths-menu");
  1948.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1949.  
  1950.     checked = displayTabIndexStylesheet && !displayTabIndexStylesheet.disabled;
  1951.     element = document.getElementById("webdeveloper-display-tab-index-menu");
  1952.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1953.  
  1954.     checked = displayTopographicInformationStylesheet && !displayTopographicInformationStylesheet.disabled;
  1955.     element = document.getElementById("webdeveloper-display-topographic-information-menu");
  1956.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1957.  
  1958.     checked = hideBackgroundImagesStylesheet && !hideBackgroundImagesStylesheet.disabled;
  1959.     element = document.getElementById("webdeveloper-hide-background-images-menu");
  1960.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1961.  
  1962.     checked = hideImagesStylesheet && !hideImagesStylesheet.disabled;
  1963.     element = document.getElementById("webdeveloper-hide-images-menu");
  1964.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1965.  
  1966.     checked = linearizePageStylesheet && !linearizePageStylesheet.disabled;
  1967.     element = document.getElementById("webdeveloper-linearize-page-menu");
  1968.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1969.  
  1970.     checked = makeImagesInvisibleStylesheet && !makeImagesInvisibleStylesheet.disabled;
  1971.     element = document.getElementById("webdeveloper-make-images-invisible-menu");
  1972.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1973.  
  1974.     checked = outlineBlockLevelElementsStylesheet && !outlineBlockLevelElementsStylesheet.disabled;
  1975.     element = document.getElementById("webdeveloper-outline-block-level-elements-menu");
  1976.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1977.  
  1978.     checked = outlineCustomElementsStylesheet && !outlineCustomElementsStylesheet.disabled;
  1979.     element = document.getElementById("webdeveloper-outline-custom-elements-menu");
  1980.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1981.  
  1982.     checked = outlineDeprecatedElementsStylesheet && !outlineDeprecatedElementsStylesheet.disabled;
  1983.     element = document.getElementById("webdeveloper-outline-deprecated-elements-menu");
  1984.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1985.  
  1986.     checked = outlineFramesStylesheet && !outlineFramesStylesheet.disabled;
  1987.     element = document.getElementById("webdeveloper-outline-frames-menu");
  1988.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1989.  
  1990.     checked = outlineImagesWithAdjustedDimensionsStylesheet && !outlineImagesWithAdjustedDimensionsStylesheet.disabled;
  1991.     element = document.getElementById("webdeveloper-outline-images-with-adjusted-dimensions-menu");
  1992.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1993.  
  1994.     checked = outlineImagesWithEmptyAltAttributesStylesheet && !outlineImagesWithEmptyAltAttributesStylesheet.disabled;
  1995.     element = document.getElementById("webdeveloper-outline-images-with-empty-alt-attributes-menu");
  1996.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  1997.  
  1998.     checked = outlineImagesWithoutAltAttributesStylesheet && !outlineImagesWithoutAltAttributesStylesheet.disabled;
  1999.     element = document.getElementById("webdeveloper-outline-images-without-alt-attributes-menu");
  2000.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2001.  
  2002.     checked = outlineImagesWithoutDimensionsStylesheet && !outlineImagesWithoutDimensionsStylesheet.disabled;
  2003.     element = document.getElementById("webdeveloper-outline-images-without-dimensions-menu");
  2004.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2005.  
  2006.     checked = outlineImagesWithoutTitleAttributesStylesheet && !outlineImagesWithoutTitleAttributesStylesheet.disabled;
  2007.     element = document.getElementById("webdeveloper-outline-images-without-title-attributes-menu");
  2008.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2009.  
  2010.     checked = outlineLinksWithoutTitleAttributesStylesheet && !outlineLinksWithoutTitleAttributesStylesheet.disabled;
  2011.     element = document.getElementById("webdeveloper-outline-links-without-title-attributes-menu");
  2012.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2013.  
  2014.     checked = outlineSelectedElementStylesheet && !outlineSelectedElementStylesheet.disabled;
  2015.     element = document.getElementById("webdeveloper-outline-selected-element-menu");
  2016.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2017.  
  2018.     checked = outlineTableCellsStylesheet && !outlineTableCellsStylesheet.disabled;
  2019.     element = document.getElementById("webdeveloper-outline-table-cells-menu");
  2020.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2021.  
  2022.     checked = outlineTablesStylesheet && !outlineTablesStylesheet.disabled;
  2023.     element = document.getElementById("webdeveloper-outline-tables-menu");
  2024.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2025.  
  2026.     checked = replaceImagesWithAltAttributesStylesheet && !replaceImagesWithAltAttributesStylesheet.disabled;
  2027.     element = document.getElementById("webdeveloper-replace-images-with-alt-attributes-menu");
  2028.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2029.  
  2030.     checked = showCommentsStylesheet && !showCommentsStylesheet.disabled;
  2031.     element = document.getElementById("webdeveloper-show-comments-menu");
  2032.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2033.  
  2034.     checked = useBorderBoxModelStylesheet && !useBorderBoxModelStylesheet.disabled;
  2035.     element = document.getElementById("webdeveloper-use-border-box-model-menu");
  2036.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2037.  
  2038.     checked = viewStyleInformationStylesheet && !viewStyleInformationStylesheet.disabled;
  2039.     element = document.getElementById("webdeveloper-view-style-information-menu");
  2040.     webdeveloper_configureEquivalentElements(element, "checked", checked);
  2041. }
  2042.  
  2043. // Updates the render mode status button
  2044. function webdeveloper_updateRenderMode()
  2045. {
  2046.     var element = document.getElementById("webdeveloper-render-mode-statusbar");
  2047.  
  2048.     // If the render mode button exists
  2049.     if(element)
  2050.     {
  2051.         const content            = window.document.getElementById("content");
  2052.         const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  2053.         const renderMode         = content.browsers[content.mTabBox.selectedIndex].contentDocument.compatMode;
  2054.         const stringBundle       = document.getElementById("webdeveloper-string-bundle");
  2055.  
  2056.         var textToolbar = false;
  2057.  
  2058.         // If the toolbar preference has a value and is set to text
  2059.         if(preferencesService.prefHasUserValue("webdeveloper.toolbar.icons") && preferencesService.getCharPref("webdeveloper.toolbar.icons") == "text")
  2060.         {
  2061.             textToolbar = true;
  2062.         }
  2063.  
  2064.         // If the render mode is quirks mode
  2065.         if(renderMode == "BackCompat")
  2066.         {
  2067.             element.setAttribute("class", "quirks webdeveloper-statusbar-button");
  2068.             element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_quirksModeTooltip"));
  2069.  
  2070.             // If the toolbar is in text mode
  2071.             if(textToolbar)
  2072.             {
  2073.                 element.setAttribute("label", stringBundle.getString("webdeveloper_quirksModeLabel"));
  2074.             }
  2075.         }
  2076.         else
  2077.         {
  2078.             element.setAttribute("class", "webdeveloper-statusbar-button");
  2079.             element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_standardsComplianceModeTooltip"));
  2080.  
  2081.             // If the toolbar is in text mode
  2082.             if(textToolbar)
  2083.             {
  2084.                 element.setAttribute("label", stringBundle.getString("webdeveloper_standardsComplianceModeLabel"));
  2085.             }
  2086.         }
  2087.     }
  2088. }
  2089.  
  2090. // View source
  2091. function webdeveloper_viewSource()
  2092. {
  2093.     const preferencesService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("");
  2094.  
  2095.     // If the view source in tab preference is set to true
  2096.     if(preferencesService.prefHasUserValue("webdeveloper.view.source.tab") && preferencesService.getBoolPref("webdeveloper.view.source.tab"))
  2097.     {
  2098.         const newTab = getBrowser().addTab("view-source:" + window.content.document.documentURI);
  2099.  
  2100.         // If the open tabs in background preference is not set or is set to false
  2101.         if(!preferencesService.prefHasUserValue("webdeveloper.open.tabs.background") || !preferencesService.getBoolPref("webdeveloper.open.tabs.background"))
  2102.         {
  2103.             getBrowser().selectedTab = newTab;
  2104.         }
  2105.     }
  2106.     else
  2107.     {
  2108.         BrowserViewSourceOfDocument(window.content.document);
  2109.     }
  2110. }
  2111.  
  2112. // JavaScript console listener
  2113. var WebDeveloperJavaScriptConsoleListener =
  2114. {
  2115.     // Observes changes in the console
  2116.     observe: function(error)
  2117.     {
  2118.         // If the document, error and error message are set
  2119.         if(document && error && error.message)
  2120.         {
  2121.             // Try to convert the error to a script error
  2122.             try
  2123.             {
  2124.                 const tempError = error.QueryInterface(Components.interfaces.nsIScriptError);
  2125.  
  2126.                 var errorCategory = error.category;
  2127.  
  2128.                 // If the error category is set
  2129.                 if(errorCategory)
  2130.                 {
  2131.                     // If the error category is content javascript
  2132.                     if(errorCategory == "content javascript")
  2133.                     {
  2134.                         const warning = error.flags & error.warningFlag != 0;
  2135.  
  2136.                         // If this is a warning
  2137.                         if(warning)
  2138.                         {
  2139.                             webdeveloper_javaScriptWarning = true;
  2140.                         }
  2141.                         else
  2142.                         {
  2143.                             webdeveloper_javaScriptError = true;
  2144.                         }
  2145.                     }
  2146.                     else if(webdeveloper_debug && errorCategory == "chrome javascript" && error.sourceName.indexOf("chrome://webdeveloper/") != -1)
  2147.                     {
  2148.                         toJavaScriptConsole();
  2149.                     }
  2150.                 }
  2151.             }
  2152.             catch(exception)
  2153.             {
  2154.                 // Do nothing
  2155.             }
  2156.         }
  2157.  
  2158.         return false;
  2159.     }
  2160. }
  2161.